Proxy
This section covers proxy features. Use it to configure reverse proxy behavior and related RouterOS proxy services.
Reverse Proxy
Reverse proxy is a service that allows the router to send HTTPS traffic to servers or to RouterOS containers/apps when "use-https" parameter is enabled in app settings, behind the router using a simple URL, instead of an IP address and creating a separate destination NAT rule.
MikroTik RouterOS performs proxying of HTTP and HTTP-proxy (for FTP and HTTP protocols) requests. The proxy server performs the Internet object cache function by storing requested Internet objects, i.e., data available via HTTP and FTP protocols on a system positioned closer to the recipients thereby speeding up customer browsing by delivering them the requested file copies from the proxy cache at local network speed. MikroTik RouterOS implements the following proxy server features:
- Regular HTTP proxy β customer (itself) specifies what the proxy server is for him.
- Transparent proxy β the customer does not know about the proxy being enabled and there isnβt a necessity for any additional configuration for the web browser of the client.
- Access list by source, destination, URL, and requested method (HTTP firewall).
- Cache access list to specify which objects to cache, and which not.
- Direct Access List β to specify which resources should be accessed directly, and which - through another proxy server.
- Logging facility β allows getting and storing information about the proxy operation.
- Parent proxy support β allows specifying another proxy server, (if they donβt have the requested object ask their parents, or to the original server).
A proxy server usually is placed at various points between users and the destination server (also known as the origin server) on the Internet.

A Web proxy (cache) watches requests coming from clients, saving copies of the responses for itself. Then, if there is another request for the same URL, it can use the response that it has, instead of asking the origin server for it again. If the proxy has not requested a file, it downloads that from the original server.
There can be many potential purposes of proxy servers:
- To increase access speed to resources (it takes less time for the client to get the object).
- Works as an HTTP firewall (denies access to undesirable web pages).
Allows filtering web content (by specific parameters, like source address, a destination address, port, URL, HTTP request method) and scanning outbound content, e.g., for data leak protection.
It may be useful to have a Web proxy running even with no cache when you want to use it only as something like an HTTP and FTP firewall (for example, denying access to undesired web pages or denying a specific type of file e.g. .mp3 files) or to redirect requests to an external proxy (possibly, to a proxy with caching functions) transparently.
Configuration examplesβ
Sub-menu: /ip/proxy
In MikroTik RouterOS, a proxy configuration is performed in the /ip/proxy menu. See below how to enable the proxy on port 8080 and set up 192.168.88.254 as the proxy source address:
[admin@MikroTik] > /ip/proxy/set enabled=yes port=8080 src-address=192.168.88.254
[admin@MikroTik] > /ip/proxy/print
enabled: yes
src-: 192.168.88.254
: 8080
anonymous: no
parent-proxy: ::
parent-proxy-: 0
cache-administrator: webmaster
max-cache-size: unlimited
max-cache-object-size: 2048KiB
cache-on-disk: no
max-client-connections: 600
max-server-connections: 600
max-fresh-time: 3d
serialize-connections: no
always-from-cache: no
cache-hit-dscp: 4
cache-path: web-proxy
When setting up a regular proxy service, make sure it serves only your clients and prevents unauthorized access to it by creating a firewall that allows only your clients to use a proxy; otherwise, it may be used as an open proxy.
Transparent proxy configuration exampleβ
RouterOS can also act as a Transparent Caching server, with no configuration required in the customerβs web browser. A transparent proxy does not modify the requested URL or response. RouterOS will take all HTTP requests and redirect them to the local proxy service. This process will be entirely transparent to the user (users may not know anything about a proxy server that is located between them and the original server), and the only difference to them will be the increased browsing speed.
To enable the transparent mode, the firewall rule in destination NAT has to be added, specifying which connections (to which ports) should be transparently redirected to the proxy. Check proxy settings above and redirect our users (192.168.1.0/24) to a proxy server:
[admin@MikroTik] /ip/firewall/nat> add chain=dstnat protocol=tcp src-address=192.168.1.0/24 dst-port=80 action=redirect to-ports=8080
[admin@MikroTik] /ip/firewall/nat> print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=dstnat protocol=tcp dst-port=80 action=redirect to-ports=8080
The web proxy can be used as a transparent and normal web proxy at the same time. In transparent mode, it is possible to use it as a standard web proxy, too. However, in this case, proxy users may have trouble reaching web pages that are accessed transparently.
Proxy-based firewall β Access Listβ
An access list is implemented in the same way as MikroTik firewall rules processed from the top to the bottom. The first matching rule specifies the decision of what to do with this connection. Connections can be matched by their source address, destination address, destination port, sub-string of the requested URL (Uniform Resource Locator), or request method. If none of these parameters is specified, every connection will match this rule.
If a connection is matched by a rule, the action property of this rule specifies whether a connection will be allowed or not (deny). If a connection does not match any rule, it will be allowed.
In this example, assume that we have configured a transparent proxy server. It will block the website https://www.facebook.com. We can always block the same for different networks by giving src-address:
/ip/proxy/access/add src-address=192.168.1.0/24 dst-host=www.facebook.com action=deny
Users from network 192.168.1.0/24 will not be able to access the website www.facebook.com.
You can also block websites that contain specific words in the URL:
/ip/proxy/access/add dst-host=:mail action=deny
This statement will block all websites which contain the word βmailβ in the URL, like www.mail.com, www.hotmail.com, mail.yahoo.com, etc.
We can also stop downloading specific types of files like .flv, .avi, .mp4, .mp3, .exe, .dat, etc.
/ip/proxy/access
add path=*.flv action=deny
add path=*.avi action=deny
add path=*.mp4 action=deny
add path=*.mp3 action=deny
add path=*.zip action=deny
add path=*.rar action=deny
Here are also available different wildcard characters, to create specific conditions and to match them by proxy access list. Wildcard properties (dst-host and dst-path) match a complete string (i.e., they will not match "example.com" if they are set to "example"). Available wildcards are '*' (match any number of any characters) and '?' (match any one character).
Regular expressions are also accepted here, but if the property should be treated as a regular expression, it should start with a colon (':').
To show that no symbols are allowed before the given pattern, we use the ^ symbol at the beginning of the pattern.
To specify that no symbols are allowed after the given pattern, we use the $ symbol at the end of the pattern.
Enabling RAM or Store-based caching.β
In this example, we will presume that you already have the proxy configured and working and you just want to enable caching. If a detailed command/parameter description is required check the reference section which is located right below the example section.
-
RAM-based caching:
- Good if you have a device with a considerable amount of RAM for caching. Enabling this on a device with 256MB of RAM or less will not give your network any benefit.
- Way faster cache writes/reads than one that is stored on USB or SATA connected media.
-
Store-based caching:
- Larger proxy caches are available simply due to medium capacity differences.
RAM proxy cache:β
Important commandsβ
- max-cache-size=
- max-cache-object-size=
- cache-on-disk=
[admin@MikroTik] /ip/proxy> set max-cache-size=unlimited max-cache-object-size=50000KiB cache-on-disk=no
...
[admin@MikroTik] /ip/proxy> print
enabled: yes
src-: ::
: 8080
anonymous: no
parent-proxy: 0.0.0.0
parent-proxy-: 0
cache-administrator: webmaster
max-cache-size: unlimited <-------
max-cache-object-size: 500000KiB <-------
cache-on-disk: no <-------
max-client-connections: 600
max-server-connections: 600
max-fresh-time: 3d
serialize-connections: no
always-from-cache: no
cache-hit-dscp: 4
cache-path: proxy-cache
Store proxy cache:β
Important commands:
- max-cache-size=
- max-cache-object-size=
- cache-on-disk=
- cache-path=
[admin@MikroTik] > proxy set cache-on-disk=yes cache-path=/usb1/proxy/cache
[admin@MikroTik] > proxy print
enabled: yes
src-: ::
: 8080
anonymous: no
parent-proxy: 0.0.0.0
parent-proxy-: 0
cache-administrator: webmaster
max-cache-size: unlimited <-------
max-cache-object-size: 50000KiB <-------
cache-on-disk: yes <-------
max-client-connections: 600
max-server-connections: 600
max-fresh-time: 3d
serialize-connections: no
always-from-cache: no
cache-hit-dscp: 4
cache-path: usb1/proxy/cache <-------
[admin@MikroTik] > /file/print
# NAME TYPE
0 skins directory
5 usb1/proxy directory
6 usb1/proxy/cache web-proxy store <-------
7 usb1/lost+found directory
Check if a cache is working:β
[admin@MikroTik] > /ip/proxy/monitor
status: running
uptime: 2w20h28m25s
client-connections: 15
server-connections: 7
requests: 79772
hits: 30513
cache-used: 481KiB
total-ram-used: 1207KiB
received-from-servers: 4042536KiB
sent-to-clients: 4399757KiB
hits-sent-to-clients: 176934KiB
Referenceβ
List of all available parameters and commands per menu.
Generalβ
Sub-menu: /ip/proxy
| Property | Description |
|---|---|
| always-from-cache (yes | no; Default: no) | Ignores client refresh requests if the content is considered fresh |
| anonymous (yes | no; Default: no) | If not set, the IP address of the client would be passed in the X-Forwarded-For header (could be accessed using HTTP_X_FORWARDED_FOR environment variable in remote servers) |
| cache-administrator (string; Default: webmaster) | Administrator's e-mail displayed on the proxy error page |
| cache-hit-dscp (integer: 0..63; Default: 4) | Automatically mark cache hit with the provided DSCP value |
| cache-on-disk (yes | no; Default: no) | Whether to store cache on disk |
| cache-path (string; Default: web-proxy) | A path where the cache will be stored, when cache-on-disk is enabled. |
| max-cache-object-size (integer: 0..4294967295[KiB]; Default: 2048KiB) | Specifies the maximal cache object size, measured in kilobytes |
| max-cache-size (none | unlimited | integer: 0..4294967295[KiB]; Default: unlimited) | Specifies the maximal cache size, measured in kilobytes |
| max-client-connections (integer: Dynamic; Default: 600) | Maximal number of connections accepted from clients (any further connections will be rejected) |
| max-fresh-time (time; Default: 3d) | Maximal time to store a cached object. The validity period of an object is usually defined by the object itself, but in case it is set too high, you can override the maximal value |
| max-server-connections (integer: Dynamic; Default: 600) | Maximal number of connections made to servers (any further connections from clients will be put on hold until some server connections terminate) |
| parent-proxy (Ip4 | ip6; Default: 0.0.0.0) | IP address and port of another HTTP proxy to redirect all requests to. If set to 0.0.0.0 parent proxy is not used. |
| parent-proxy-port (integer: 0..65535; Default: 0) | Port that the parent proxy is listening on. |
| port (integer: 0..65535; Default: 8080) | TCP port the proxy server will be listening on. This port has to be specified on all clients that want to use the server as an HTTP proxy. A transparent (with zero configuration for clients) proxy setup can be made by redirecting HTTP requests to this port in the IP firewall using the destination NAT feature |
| serialize-connections (yes | no; Default: no) | Do not make multiple connections to the server for multiple client connections, if possible (i.e. the server supports persistent HTTP connections). Clients will be served on the FIFO principle; the next client is processed when the response transfer to the previous one is completed. If a client is idle for too long (max 5 seconds by default), it will give up waiting and open another connection to the server |
| src-address (Ip4 | Ip6; Default: 0.0.0.0) | A proxy will use a specified address when connecting to the parent proxy or website. If set to 0.0.0.0 then the appropriate IP address will be taken from the routing table. |
Access Listβ
Sub-menu: /ip/proxy/access
An access list is configured like regular firewall rules. Rules are processed from the top to the bottom. The first matching rule specifies the decision of what to do with this connection. There is a total of 6 classifiers that specify matching constraints. If none of these classifiers is specified, the particular rule will match every connection.
If a connection is matched by a rule, the action property of this rule specifies whether a connection will be allowed or not. If the particular connection does not match any rule, it will be allowed.
| Property | Description |
|---|---|
| action (allow | deny; Default: allow) | Specifies whether to pass or deny matched packets |
| dst-address (Ip4[-Ip4 | /0..32] | Ip6/0..128; Default: ) | The destination address of the target server. |
| dst-host (string; Default: ) | IP address or DNS name used to make a connection to the target server (this is the string the user wrote in a browser before specifying the port and path to a particular web page) |
| dst-port (integer[-integer[,integer[,...]]]: 0..65535; Default: ) | List or range of ports the packet is destined to |
| local-port (integer: 0..65535; Default: ) | Specifies the port of the web proxy via which the packet was received. This value should match one of the ports the web proxy is listening on. |
| method (any | connect | delete | get | head | options | post | put | trace; Default: ) | The HTTP method used in the request (see the HTTP Methods section at the end of this document) |
| path (string; Default: ) | The name of the requested page within the target server (i.e. the name of a particular web page or document without the name of the server it resides on) |
| redirect-to (string; Default: ) | In case access is denied by this rule, the user shall be redirected to the URL specified here |
| src-address (Ip4[-Ip4 | /0..32] | Ip6/0..128; Default: ) | The source address of the connection originator. |
Read-only properties:
| Property | Description |
|---|---|
| hits (integer) | Count of requests that were matched by this rule |
Wildcard properties (dst-host and dst-path) match a complete string (i.e., they will not match "example.com" if they are set to "example"). Available wildcards are '*' (match any number of any characters) and '?' (match any one character). Regular expressions are also accepted here, but if the property should be treated as a regular expression, it should start with a colon (':').
Small hints in using regular expressions:
- \ symbol sequence is used to enter a \ character in the console;
- . pattern means only (in regular expressions, a single dot in a pattern means any symbol);
- To show that no symbols are allowed before the given pattern, we use the ^ symbol at the beginning of the pattern.
- To specify that no symbols are allowed after the given pattern, we use the $ symbol at the end of the pattern.
- To enter [ or ] symbols, you should escape them with a backslash "["};
It is strongly recommended to deny all IP addresses except those behind the router as the proxy still may be used to access your internal-use-only (intranet) web servers. Also, consult examples in the Firewall Manual on how to protect your router.
Direct Accessβ
Sub-menu: /ip/proxy/direct
If a parent-proxy property is specified, it is possible to tell the proxy server whether to try to pass the request to the parent proxy or to resolve it by connecting to the requested server directly. The direct Access List is managed just like the Proxy Access List described in the previous chapter except for the action argument. Unlike the access list, the direct proxy access list has a default action equal to deny. It takes place when no rules are specified or a particular request does not match any rule.
| Property | Description |
|---|---|
| action (allow | deny; Default: allow) | Specifies the action to perform on matched packets:
|
| dst-address (Ip4[-Ip4 | /0..32] | Ip6/0..128; Default: ) | The destination address of the target server. |
| dst-host (string; Default: ) | IP address or DNS name used to make a connection to the target server (this is the string the user wrote in a browser before specifying port and path to a particular web page) |
| dst-port (integer[-integer[,integer[,...]]]: 0..65535; Default: ) | List or range of ports used by the connection to the target server. |
| local-port (integer: 0..65535; Default: ) | Specifies the port of the web proxy via which the packet was received. This value should match one of the ports the web proxy is listening on. |
| method (any | connect | delete | get | head | options | post | put | trace; Default: ) | The HTTP method used in the request (see HTTP Methods section at the end of this document) |
| path (string; Default: ) | Name of the requested page within the target server (i.e. the name of a particular web page or document without the name of the server it resides on) |
| src-address (Ip4[-Ip4 | /0..32] | Ip6/0..128; Default: ) | The source address of the connection originator. |
Read-only properties:
| Property | Description |
|---|---|
| hits (integer) | Count of requests that were matched by this rule |
Cache Managementβ
Sub-menu: /ip/proxy/cache
The cache access list specifies which requests (domains, servers, pages) have to be cached locally by web proxy, and which do not. This list is implemented exactly the same way as the web proxy access list. The default action is to cache an object (if no matching rule is found).
| Property | Description |
|---|---|
| action (allow | deny; Default: allow) | Specifies the action to perform on matched packets:
|
| dst-address (Ip4[-Ip4 | /0..32] | Ip6/0..128; Default: ) | The destination address of the target server |
| dst-host (string; Default: ) | IP address or DNS name used to make a connection to the target server (this is the string the user wrote in a browser before specifying port and path to a particular web page) |
| dst-port (integer[-integer[,integer[,...]]]: 0..65535; Default: ) | List or range of ports the packet is destined to. |
| local-port (integer: 0..65535; Default: ) | Specifies the port of the web proxy via which the packet was received. This value should match one of the ports the web proxy is listening on. |
| method (any | connect | delete | get | head | options | post | put | trace; Default: ) | The HTTP method used in the request (see HTTP Methods section at the end of this document) |
| path (string; Default: ) | Name of the requested page within the target server (i.e. the name of a particular web page or document without the name of the server it resides on) |
| src-address (Ip4[-Ip4 | /0..32] | Ip6/0..128; Default: ) | The source address of the connection originator |
Read-only properties:
| Property | Description |
|---|---|
| hits (integer) | Count of requests that were matched by this rule |
Connectionsβ
Sub-menu: /ip/proxy/connections
This menu contains the list of current connections the proxy is serving.
Read-only properties:
| Property | Description |
|---|---|
| client () | |
| dst-address (Ip4 | Ip6) | IPv4/Ipv6 destination address of the connection |
| protocol (string) | Protocol name |
| rx-bytes (integer) | The number of bytes received by the client |
| server () | |
| src-address (Ip4 | Ip6) | Ipv4/ipv6 address of the connection originator |
| state (closing | connecting | converting | hotspot | idle | resolving | rx-header | tx-body | tx-eof | tx-header | waiting) | Connection state:
|
| tx-bytes (integer) | The number of bytes sent by the client |
Cache Insertsβ
Sub-menu: /ip/proxy/inserts
This menu shows statistics on objects stored in a cache (cache inserts).
Read-only properties:
| Property | Description |
|---|---|
| denied (integer) | A number of inserts were denied by the caching list. |
| errors (integer) | Number of disk or other system-related errors |
| no-memory (integer) | Number of objects not stored because there was not enough memory |
| successes (integer) | A number of successful cache inserts. |
| too-large (integer) | Number of objects too large to store |
Cache Lookupsβ
Sub-menu: /ip/proxy/lookup
This menu shows statistics on objects read from cache (cache lookups).
Read-only properties:
| Property | Description |
|---|---|
| denied (integer) | Number of requests denied by the access list. |
| expired (integer) | Number of requests found in cache, but expired, and, thus, requested from an external server |
| no-expiration-info (integer) | Conditional request received for a page that does not have the information to compare the request with |
| non-cacheable (integer) | Number of requests requested from the external servers unconditionally (as their caching is denied by the cache access list) |
| not-found (integer) | Number of requests not found in the cache, and, thus, requested from an external server (or parent proxy if configured accordingly) |
| successes (integer) | Number of requests found in the cache. |
Cache Contentsβ
Sub-menu: /ip/proxy/cache-contents
This menu shows cached contents.
Read-only properties:
| Property | Description |
|---|---|
| file-size (integer) | Cached object size |
| last-accessed (time) | |
| last-accessed-time (time) | |
| last-modified (time) | |
| last-modified-time (time) | |
| uri (string) | Uniform Resource Identifier of the cached object |
HTTP Methodsβ
Optionsβ
This method is a request for information about the communication options available on the chain between the client and the server identified by the Request-URI. The method allows the client to determine the options and (or) the requirements associated with a resource without initiating any resource retrieval.
GETβ
This method retrieves whatever information is identified by the Request-URI. If the Request-URI refers to a data processing process then the response to the GET method should contain data produced by the process, not the source code of the process procedure(-s), unless the source is the result of the process.
The GET method can become a conditional GET if the request message includes an If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. The conditional GET method is used to reduce network traffic by specifying that the transfer of the entity should occur only under circumstances described by conditional header field(s).
The GET method can become a partial GET if the request message includes a Range header field. The partial GET method intends to reduce unnecessary network usage by requesting only parts of entities without transferring data already held by the client.
The response to a GET request is cacheable if and only if it meets the requirements for HTTP caching.
HEADβ
This method shares all features of the GET method except that the server must not return a message-body in the response. This retrieves the metainformation of the entity implied by the request which leads to its wide usage for testing hypertext links for validity, accessibility, and recent modification.
The response to a HEAD request may be cacheable in the way that the information contained in the response may be used to update the previously cached entity identified by that Request-URI.
POSTβ
This method requests that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI.
The actual action performed by the POST method is determined by the origin server and is usually Request-URI dependent.
Responses to the POST method are not cacheable, unless the response includes appropriate Cache-Control or Expires header fields.
PUTβ
This method requests that the enclosed entity be stored under the supplied Request-URI. If another entity exists under the specified Request-URI, the enclosed entity should be considered as an updated (newer) version of that residing on the origin server. If the Request-URI is not pointing to an existing resource, the origin server should create a resource with that URI.
If the request passes through a cache and the Request-URI identifies one or more currently cached entities, those entries should be treated as stale. Responses to this method are not cacheable.
TRACEβ
This method invokes a remote, application-layer loop-back of the request message. The final recipient of the request should reflect the message received back to the client as the entity-body of a 200 (OK) response. The final recipient is either the origin server or the first proxy or gateway to receive a Max-Forwards value of 0 in the request. A TRACE request must not include an entity.
Responses to this method MUST NOT be cached.